LinuC-2 - 201試験 - 2.02:ファイルシステムとストレージ管理 - 2.02.1 ファイルシステムの設定とマウント

Last Update : August 21 2022 17:47:20

     

a. ファイルシステムの概要

データの「読み込み」「書き込み」などの操作を「ファイル」単位で行います。これは、ファイルシステムが記憶媒体(ハードディスク・CD-ROM・etc.)を抽象化し、データ格納の仲介作業を行っているためです。また、比較的サイズの大きなファイルの書き込みも、それほどストレスを感じないで行うことができます。これも、ファイルシステムがキャッシュメモリを効率的に利用し、CPUに比べて大幅にアクセス速度の遅い二次記憶装置(ハードディスクなど)に対して非同期書き込みを行うことで、レスポンスタイムを向上しているためです。ファイルシステムは、このように大容量の二次記憶装置を効率的に管理し、利用するための手段を提供する基本的なOSのサービスの1つです。

Linuxでは、全てをファイルとして扱うようになっています。これは通常のデータファイルだけではなく、HDD、CD-ROM、マウスなど様々なデバイスへのアクセスもファイルとして扱う仕組みになっています。この仕組みを提供するのがVFSという仮想的なファイルシステムです。VFSは下位の物理的な媒体を抽象化し、データ、デバイスを含む全てのコンピュータリソースに対して統一的なファイルアクセスという入出力インターフェイスを提供します。これによりリソースの差異を気にすることなく、様々な対象に対して統一的にアクセスを行うことができます。

さらにVFSにはファイルシステムの抽象化という役割もあり、これによって異なる複数のファイルシステムに対して透過的にアクセスすることが可能になっており、ファイルシステムの種類を意識せずに利用することができます。VFSは、プログラムからのファイルシステムの操作を固有のファイルシステムの操作に変換します。このためユーザが実行するプログラムはファイルシステムの差異を意識する必要がなく、統一的なアクセス方法で実際には異なるファイルシステムにアクセスできます。


b. fstab構成

ファイルシステムの情報は、/etc/fstabファイルに記述されています。

参照 => 1.05.3 ファイルシステムの作成と管理、マウント

fstabで指定するデバイスファイル名は、UUID(Universally Unique IDentifier:汎用一意識別子)で指定することも可能です。

UUIDを確認するには、blkidコマンドを使います。

# blkid | grep UUID
/dev/mapper/VolGroup00-LogVol00: UUID="80f9868c-1fbb-43c7-88ce-802851bd574f" TYPE="ext3" /dev/sda1: LABEL="/boot" UUID="e752ab8d-38ef-47ae-a61b-d617fdbaed11" TYPE="ext3" /dev/VolGroup00/LogVol00: UUID="80f9868c-1fbb-43c7-88ce-802851bd574f" TYPE="ext3"

また、/dev/disk/by-uuid以下のデバイスファイルでも確認できます。

# ls -l /dev/disk/by-uuid/
合計 0 lrwxrwxrwx 1 root root 10 7月 6 10:55 e752ab8d-38ef-47ae-a61b-d617fdbaed11 -> ../../sda1

通常はUUIDは変更する必要はありませんが、tune2fsコマンドで変更することも可能です。UUIDの作成にはuuidgenコマンドを使用します。

# tune2fs -U `uuidgen` /dev/sda1

カーネルがサポートしているファイルシステムは、/proc/filesystems で確認できます。

$ cat /proc/filesystems
nodev sysfs nodev rootfs nodev bdev nodev proc nodev cpuset nodev binfmt_misc nodev debugfs nodev securityfs nodev sockfs nodev usbfs nodev pipefs nodev anon_inodefs nodev futexfs nodev tmpfs nodev inotifyfs nodev eventpollfs nodev devpts ext2 nodev ramfs nodev hugetlbfs iso9660 nodev mqueue ext3 nodev rpc_pipefs nodev autofs

先頭が nodev になっているものは、ファイルシステムがブロックデバイスにマウントされていないことを表します。

今現在どのようなファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかを調べるには、/etc/mtabを確認します。

$ cat /etc/mtab
/dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 devpts /dev/pts devpts rw,gid=5,mode=620 0 0 /dev/sda1 /boot ext3 rw 0 0 tmpfs /dev/shm tmpfs rw 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0

/etc/mtabファイルはシステムが編集するので、書き換えないようにしてください。

また、/proc/mountsでも同じような情報を確認できます。

$ cat /proc/mounts
rootfs / rootfs rw 0 0 /dev/root / ext3 rw,data=ordered 0 0 /dev /dev tmpfs rw 0 0 /proc /proc proc rw 0 0 /sys /sys sysfs rw 0 0 /proc/bus/usb /proc/bus/usb usbfs rw 0 0 devpts /dev/pts devpts rw 0 0 /dev/sda1 /boot ext3 rw,data=ordered 0 0 tmpfs /dev/shm tmpfs rw 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0 /etc/auto.misc /misc autofs rw,fd=7,pgrp=2491,timeout=300,minproto=5,maxproto=5,indirect 0 0 -hosts /net autofs rw,fd=13,pgrp=2491,timeout=300,minproto=5,maxproto=5,indirect 0 0


c. ファイルシステムのマウントとアンマウント

d. sync

ファイルに対して書き込みを行っても、実際にはすぐに記憶媒体に書き込まれるわけではなく、一旦メモリ上のバッファ領域に保存され、その後徐々に記憶媒体に保存されます。アプリケーションは、バッファ領域に書き込まれた時点で、ファイルの書き込み処理は終了したものとして次の動作に進みます。メモリに比べてそれ以外の記憶媒体は書き込み処理が数倍遅いので、このように動作することで処理全体の時間を短縮することができます。
ただし、バッファ領域はメモリ上にあるため、記憶媒体に書き込む前に電源断などが起きるとデータを消失してしまいます。
syncコマンドを実行することで、バッファ領域に残っているデータをすぐに記憶媒体へ書き込みます。

● sync コマンド構文
  sync

1.ページキャッシュとバッファキャッシュ

バッファキャッシュは主にブロック型デバイスのI/O操作に使用されるキャッシュ、ページキャッシュはプロセス側から見てCPUの仮想アドレス空間を共有するキャッシュとされています。つまり、プロセスのインターフェイスとなるページ機構のキャッシュが「ページキャッシュ」、I/Oに近い部分が「バッファキャッシュ」と大まかに分類できます。
 少し前のカーネル2.2では、伝統的に読み込みは「ページキャッシュ」、書き込みは「バッファキャッシュ」という2つの方針が取られてきましたが、2.4からは読み込み/書き込みともに「ページキャッシュ」→「バッファキャッシュ」という流れに統合されました。これがI/Oサブシステムの基本的なパフォーマンスを向上させたといわれています。


e. スワップ領域

スワップ領域とは、コンピュータ・システムの動作中に、メイン・メモリー(実メモリー)を使い切りそうになり、空き容量が不足した場合、実メモリーから使用中の内容の一部を取り出して退避するためのハード・ディスク上の領域です。Linuxでは、専用の領域としてパーティション作成時に確保します。スワップ領域の容量や使用状況は、freeコマンドで確認できます。
スワップ領域に退避した内容に再びアクセスするためには、実メモリー上に復元する処理が必要です。これを「スワップイン」と呼びます。その逆の退避する処理は「スワップアウト」です。

swapを追加する方法としては、ディスクにswap用のパーティションを作成する方法と、通常のファイルシステムの上にswap用のファイルを作成し、それをあたかもswap専用の領域として使わせる方法とがあります。
ディスクにパーティションとして未使用の領域がある場合は前者で、すでにディスクのすべてにパーティションを切って使用している場合は、余裕がないので後者の方法を使って一時的に使用する方法があります。

swap用のファイルを作成し、それをswap領域として追加する手順を以下に記述します。

①swap用のファイルを作成する
②作成したswap用ファイルの属性を変更する
③swap用のファイルをswapとして登録する
④(必要に応じて)fstabにその領域をswapとしてマウントするように記述する

 ※④を実施しないと、リブートした時にはその領域をswapとして使用しなくなってしまいます。

①swap用のファイルを作成する
まずは、swap用のファイルを作成します。ここで作成したファイルの大きさがそのまま「追加されるswap領域の大きさ」になります。よって、2GBのswap領域を追加したい場合は、「2GBの大きさのファイル」を作成することになります。

 ddコマンドを使います。

 dd if=/dev/zero of=swap用ファイルのパス名 bs=単位 count=サイズ

例えば、256MBのswap領域を追加したいなら、単位には「1M」を、サイズには「256」と書きます、4GBの場合は、単位には「1G」を、サイズには「4」と書きます。
そして、swap用ファイルのパス名にはこれから作成するswap用ファイルを指定します。
例として、/swap.extended というファイルで2GBの領域を追加します。

# dd if=/dev/zero of=/swap.extended bs=1M count=2048
# ls -l / total 2099374   (途中省略) -rw-r--r-- 1 root root 2147483648 Mar 5 11:43 swap.extended drwxr-xr-x 9 root root 0 Feb 18 03:02 sys drwxrwxrwt 7 root root 12288 Mar 5 13:40 tmp drwxr-xr-x 15 root root 4096 Sep 14 2006 usr drwxr-xr-x 21 root root 4096 Jun 5 2008 var

swapファイルが作成されました。

②作成したswap用ファイルの属性を変更する
続いて、今作成したファイルをswap用ファイルとして属性を変更します。コマンドはmkswapコマンドです。

● mkswap コマンド構文
  mkswap [オプション] [デバイスファイル名またはファイル名]

● mkswap コマンドオプション
 -c スワップ作成前に不良ブロックのチェックを行う
 -L ラベル ラベルを指定する

なお、パス名に続けてswapとして使用する領域の大きさを変更することが出来ますが、まずほとんどのケースでは指定する必要はありません。「2GBのswap用ファイルを作成したものの、このうち1GBしか使いたくない」場合など、特殊なケースで指定します。
今回はswap用ファイルの全ての領域をそのままswapとして使用したいので、指定を省略します。今回の例では、以下のようにコマンドを投入することになります。

# mkswap /swap.extended

③swap用のファイルをswapとして登録する
つぎにswap領域としてOSに認識させます。ここで用いるコマンドはswaponコマンドです。

● swapon コマンド構文
  swapon [オプション] [デバイスファイル名またはファイル名]

● swapon コマンドオプション
 -a /etc/fstab内のスワップ領域をすべて有効にする
 -s スワップ領域を表示する

 ということになるので、今回の例では

# swapon /swap.extended

swapが追加されたかどうか確認します。

# cat /proc/swaps
Filename Type Size Used Priority /dev/sda2 partition 2096472 2074848 -1 /swap.extended file 2097144 470944 -2

または、swaponコマンドに-sオプションで確認

# swapon -s
Filename Type Size Used Priority /dev/sda2 partition 2096472 2074848 -1 /swap.extended file 2097144 470944 -2

元々の2GBのswap領域に加え、新しく2GBのswap領域が追加されているのがわかります。
④ fstabにその領域をswapとして起動時にマウントするように記述します
最後に/etc/fstabに今追加したswap領域を自動的にマウントするように追加する必要があります。

# cat /etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details   (途中省略) /dev/sda2 swap swap defaults 0 0 /swap.extended swap swap defaults 0 0

これで、サーバをリブートしても今追加したswap領域が自動的にマウントされるようになります。

スワップ領域を無効にするには、swapoffコマンドを使います。

● swapoff コマンド構文
  swapoff [オプション] [デバイスファイル名またはファイル名]

● swapoff コマンドオプション
 -a /etc/fstab内のスワップ領域をすべて無効にする


f. UUID

UUID(ユーユーアイディー)は、Universally Unique Identifier(ユニバーサリー・ユニーク・アイデンティファイア)の頭文字をとって作られた言葉です。
オブジェクトを識別するための128ビットの文字列を指し、「世界中で唯一のID」と表現されます。UUIDは自由に生成でき、認定機関に登録する必要もありません。生成方法によって重複する確率が極めて低いと言われている点も特徴です。
UUIDは、システムハードウェア情報とタイムスタンプをそのシードの一部として、ランダムに生成されます。UUIDは、通常、デバイスに固有なタグを付けるために使用されます。
UUIDの形式は128ビット(16バイト)の値で表されます。そして文字表記する際は、先頭から4ビットごとに16進数の値(0~F)に変換し、「XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX」のように8桁-4桁-4桁-12桁に区切って表現します。
UUIDは、ファイルシステムのプロパティであり、ドライブを再フォーマットすれば変更できます。
どのブロックデバイスのUUIDも、/dev/disk/by-uuidディレクトリ内で見つけることができます。たとえば、UUIDエントリは次のようになります。 tux > ls -og /dev/disk/by-uuid/

1. UUIDを確認するには、blkidコマンドを使います。

# blkid
/dev/mapper/almalinux-swap: UUID="12ff13c7-40b7-44c8-9883-376c94c03469" TYPE="swap" /dev/nvme0n1p1: UUID="febf2688-00f3-4caa-b50c-4d55023cafc8" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="8d76b624-01" /dev/nvme0n1p2: UUID="FzF3XA-k2FI-rXwq-MtZ5-Rlxq-6lhB-D40qk5" TYPE="LVM2_member" PARTUUID="8d76b624-02" /dev/nvme0n2: UUID="8f78d740-3af3-4d83-9742-fa80bf312361" BLOCK_SIZE="512" TYPE="xfs" /dev/mapper/almalinux-root: UUID="9e3d3702-695a-4a0a-9a57-7b60dfa04f74" BLOCK_SIZE="512" TYPE="xfs"

または、/dev/disk/by-uuid/ の下にデバイスファイルが作成されているので、UUID が確認できる。

# ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 8月 3 17:56 12ff13c7-40b7-44c8-9883-376c94c03469 -> ../../dm-1 lrwxrwxrwx 1 root root 13 8月 3 17:56 8f78d740-3af3-4d83-9742-fa80bf312361 -> ../../nvme0n2 lrwxrwxrwx 1 root root 10 8月 3 17:56 9e3d3702-695a-4a0a-9a57-7b60dfa04f74 -> ../../dm-0 lrwxrwxrwx 1 root root 15 8月 3 17:56 febf2688-00f3-4caa-b50c-4d55023cafc8 -> ../../nvme0n1p1

2. 接続されているディスクの一覧を表示する。
ハードディスクの一覧を取得するにはlsblkコマンドを使います。ツリー構造で中身のパーティション情報も分かりやすく表示してくれる。root権限もいらない。

$ lsblk /
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0                 11:0    1 1024M  0 rom  
nvme0n1            259:0    0   20G  0 disk 
├─nvme0n1p1        259:1    0    1G  0 part /boot
└─nvme0n1p2        259:2    0   19G  0 part 
  ├─almalinux-root 253:0    0   17G  0 lvm  /
  └─almalinux-swap 253:1    0    2G  0 lvm  [SWAP]
nvme0n2            259:3    0    5G  0 disk 

lsblkがない場合は、fdisk -lでもディスクの一覧を表示できる。


z. 出題範囲概要

概要 :
  • 標準的なLinuxファイルシステムの適切な設定と操作ができる。これには、各種ファイルシステムの設定およびマウントも含まれる。

詳細 :
  • fstab設定の概念
    /etc/fstab
  • ファイルシステムのマウントとアンマウント
    mount, umount, /etc/mtab, /proc/mounts, systemd
    マウントの順番
  • スワップパーティションおよびファイルを操作するツール
    swapon, swapoff, mkswap
  • ファイルシステムを特定しマウントするための UUID の使用
    blkid, lsblk

  [ 例題 ] 


         

    www.it-shikaku.jp